package main

import (
	"fmt"
	"os"
	"strings"
)

func main() {
	//fmt.Println(echo1())
	//fmt.Println(echo2())
	//fmt.Println(echo3())
	fmt.Println(echo4())
}

func echo1() string {
	var s, sep string
	for i := 1; i < len(os.Args); i++ {
		s += sep + os.Args[i]
		sep = " "
	}
	return s
}

/**
os.Args 变量是一个字符串（string）的 切片（slice）（译注：slice 和 Python 语言中的切片类似，是一个简版的动态数组）
切片是 Go 语言的基础概念，稍后详细介绍。现在先把切片 s 当作数组元素序列，序列的长度动态变化，
用 s[i] 访问单个元素，用 s[m:n] 获取子序列（译注：和 Python 里的语法差不多）。
序列的元素数目为 len(s)。和大多数编程语言类似，区间索引时，Go 语言里也采用左闭右开形式，
即，区间包括第一个索引元素，不包括最后一个，因为这样可以简化逻辑。
（译注：比如 a=[1,2,3,4,5], a[0:3]=[1,2,3]，不包含最后一个元素）。
比如 s[m:n] 这个切片，0≤m≤n≤len(s)，包含 n-m 个元素。

os.Args 的第一个元素：os.Args[0]，是命令本身的名字；意思是命令里的第一个参数，也就是 go run 后接的第一个参数
其它的元素则是程序启动时传给它的参数。
s[m:n] 形式的切片表达式，产生从第 m 个元素到第 n-1 个元素的切片，
下个例子用到的元素包含在 os.Args[1:len(os.Args)] 切片中。
如果省略切片表达式的 m 或 n，会默认传入 0 或 len(s)，
因此前面的切片可以简写成 os.Args[1:]。
*/

func echo2() string {
	s, sep := "", ""
	for _, arg := range os.Args[1:] {
		s += sep + arg
		sep = " "
	}
	return s
}

func echo3() string {
	return strings.Join(os.Args[1:], " ")
}

func echo4() string {
	return os.Args[0]
}
